package com.yfs.cloud.aop;

import java.util.Objects;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import com.yfs.cloud.authority.UserAuthority;
import com.yfs.cloud.authority.UserAuthorityContextHolder;
import com.yfs.cloud.entity.BaseEntity;

/**
 * 
* @Company: 影法師工作室
* @Description: 增、改时设置实体类的基本信息, 所谓基本信息指的是创建时间, 修改时间, 创建人, 修改人 
* @author 影法師  
* @date 2020年8月18日 下午10:43:14 
* @version V1.0
 */
@Aspect
@Component
public class SetBasicInfoAspect {

	// service.impl 包下面的任何类的任何以 create 开头或者以 modify 开头的方法
	@Pointcut("execution(public * com.yfs.cloud.service.impl.*.create*(..)) || execution(public * com.yfs.cloud.service.impl.*.modify*(..))")
	public void doNothing() {
	}

	@Before("doNothing()")
	public void doBefore(JoinPoint joinPoint) {
		Object[] args = joinPoint.getArgs();
		// 仅仅处理 create(User user); modify(User user) 这样的方法, 对于非这种入参的增删改方法,
		// 例如createOrder(Long goodsId) 这种,
		// 就只能自己代码中填入creator、modifier、createTime、modifyTime等基本信息了
		if (args.length != 1 || !(args[0] instanceof BaseEntity)) {
			return;
		}
		// 准备创建或者修改的实体
		BaseEntity baseEntity = (BaseEntity) args[0];
		// 获取当前操作人员
		UserAuthority operator = UserAuthorityContextHolder.getUserInfo();
		// 如果是创建方法
		if (joinPoint.getSignature().getName().startsWith("create")) {
			if (!Objects.isNull(operator)) { // 有可能是空, 例如不需要登录的系统
				baseEntity.setCreator(operator.getUserId());
			}
			baseEntity.setCreateTime(System.currentTimeMillis());
			baseEntity.setDeleted((byte) 0);
			baseEntity.setVersion(0L);
		}
		if (!Objects.isNull(operator)) {
			baseEntity.setModifier(operator.getUserId());
		}
		baseEntity.setModifyTime(System.currentTimeMillis());
	}

}
